/mnt/e/PROGRAMOWANIE/malina/iDom_server_OOP/libs/Statistic/statistic.h
Line | Count | Source |
1 | | #ifndef STATISTIC_H |
2 | | #define STATISTIC_H |
3 | | #include <iostream> |
4 | | #include <deque> |
5 | | #include <numeric> |
6 | | #include <algorithm> |
7 | | #include <sstream> |
8 | | #include <cmath> |
9 | | #include <vector> |
10 | | |
11 | | template <class T> |
12 | | class STATISTIC |
13 | | { |
14 | | public: |
15 | | STATISTIC(unsigned int size): m_size(size) |
16 | 533 | { |
17 | 533 | |
18 | 533 | } Line | Count | Source | 16 | 517 | { | 17 | 517 | | 18 | 517 | } |
Line | Count | Source | 16 | 16 | { | 17 | 16 | | 18 | 16 | } |
|
19 | 3 | void resize(unsigned int i){ |
20 | 3 | if (i < m_size){ |
21 | 24 | while(m_dequeue.size()> i){ |
22 | 21 | pop_front(); |
23 | 21 | } |
24 | 3 | } |
25 | 3 | m_size = i; |
26 | 3 | } |
27 | 79 | T size(){ |
28 | 79 | return static_cast<T>(m_dequeue.size()); |
29 | 79 | } |
30 | 10 | void push_front(T v){ |
31 | 10 | if (m_dequeue.size() >= m_size){ |
32 | 1 | pop_back(); |
33 | 1 | } |
34 | 10 | m_dequeue.push_front(v); |
35 | 10 | } |
36 | 599 | void push_back(T v){ |
37 | 599 | if (m_dequeue.size() >= m_size){ |
38 | 2 | pop_front(); |
39 | 2 | } |
40 | 599 | m_dequeue.push_back(v); |
41 | 599 | } _ZN9STATISTICIdE9push_backEd Line | Count | Source | 36 | 307 | void push_back(T v){ | 37 | 307 | if (m_dequeue.size() >= m_size){ | 38 | 2 | pop_front(); | 39 | 2 | } | 40 | 307 | m_dequeue.push_back(v); | 41 | 307 | } |
_ZN9STATISTICIiE9push_backEi Line | Count | Source | 36 | 292 | void push_back(T v){ | 37 | 292 | if (m_dequeue.size() >= m_size){ | 38 | 0 | pop_front(); | 39 | 0 | } | 40 | 292 | m_dequeue.push_back(v); | 41 | 292 | } |
|
42 | 3 | void pop_back(){ |
43 | 3 | m_dequeue.pop_back(); |
44 | 3 | // std::cout <<"pop_back"<<std::endl; |
45 | 3 | } |
46 | 23 | void pop_front(){ |
47 | 23 | m_dequeue.pop_front(); |
48 | 23 | // std::cout <<"pop_front"<<std::endl; |
49 | 23 | } _ZN9STATISTICIdE9pop_frontEv Line | Count | Source | 46 | 23 | void pop_front(){ | 47 | 23 | m_dequeue.pop_front(); | 48 | 23 | // std::cout <<"pop_front"<<std::endl; | 49 | 23 | } |
Unexecuted instantiation: _ZN9STATISTICIiE9pop_frontEv |
50 | | ///////////////////////////////////////////// statistic ///////////////////////////// |
51 | 13 | T median(){ |
52 | 13 | auto backup = m_dequeue; |
53 | 13 | std::sort(backup.begin(), backup.end()); |
54 | 13 | if (backup.size() % 2 != 0){ |
55 | 5 | return backup[backup.size() / 2]; |
56 | 5 | } |
57 | 8 | else{ |
58 | 8 | T m = backup[backup.size() / 2] + backup[(backup.size() / 2)-1]; |
59 | 8 | return m /2 ; |
60 | 8 | } |
61 | 13 | } _ZN9STATISTICIdE6medianEv Line | Count | Source | 51 | 5 | T median(){ | 52 | 5 | auto backup = m_dequeue; | 53 | 5 | std::sort(backup.begin(), backup.end()); | 54 | 5 | if (backup.size() % 2 != 0){ | 55 | 3 | return backup[backup.size() / 2]; | 56 | 3 | } | 57 | 2 | else{ | 58 | 2 | T m = backup[backup.size() / 2] + backup[(backup.size() / 2)-1]; | 59 | 2 | return m /2 ; | 60 | 2 | } | 61 | 5 | } |
_ZN9STATISTICIiE6medianEv Line | Count | Source | 51 | 8 | T median(){ | 52 | 8 | auto backup = m_dequeue; | 53 | 8 | std::sort(backup.begin(), backup.end()); | 54 | 8 | if (backup.size() % 2 != 0){ | 55 | 2 | return backup[backup.size() / 2]; | 56 | 2 | } | 57 | 6 | else{ | 58 | 6 | T m = backup[backup.size() / 2] + backup[(backup.size() / 2)-1]; | 59 | 6 | return m /2 ; | 60 | 6 | } | 61 | 8 | } |
|
62 | 23 | T sum(){ |
63 | 23 | return std::accumulate(m_dequeue.begin(), m_dequeue.end(), static_cast<T>(0)); |
64 | 23 | } |
65 | | |
66 | 23 | T average(){ |
67 | 23 | T av = sum() /size(); |
68 | 23 | return av; |
69 | 23 | } |
70 | | |
71 | 5 | T max(){ |
72 | 5 | T max = m_dequeue[0]; |
73 | 40 | for (auto v : m_dequeue){ |
74 | 40 | if (v > max){ |
75 | 13 | max = v; |
76 | 13 | } |
77 | 40 | } |
78 | 5 | return max; |
79 | 5 | } |
80 | | |
81 | 5 | T min(){ |
82 | 5 | T min = m_dequeue[0]; |
83 | 40 | for (auto v : m_dequeue){ |
84 | 40 | if (v < min){ |
85 | 3 | min = v; |
86 | 3 | } |
87 | 40 | } |
88 | 5 | return min; |
89 | 5 | } |
90 | | |
91 | 1 | T range(){ |
92 | 1 | return max() - min(); |
93 | 1 | } |
94 | | |
95 | 6 | T standardDeviation(){ |
96 | 6 | double standardDeviation = 0.0; |
97 | 6 | T _av = average(); |
98 | 6 | |
99 | 38 | for(int i = 0; i < size(); ++i){ |
100 | 32 | standardDeviation += pow(m_dequeue.at(i) - _av, 2); |
101 | 32 | } |
102 | 6 | return sqrt(standardDeviation / size()); |
103 | 6 | } |
104 | | |
105 | 3 | T coefficientOfVariation(){ |
106 | 3 | |
107 | 3 | return (standardDeviation()/average()) /** 100*/; |
108 | 3 | } |
109 | | |
110 | 21 | T mode(){ |
111 | 21 | |
112 | 21 | T _mode = 0; |
113 | 21 | T _modeTemp = 0; |
114 | 21 | int counter = 1; |
115 | 21 | int modeCounter = 1; |
116 | 21 | auto backup = m_dequeue; |
117 | 21 | if(m_dequeue.size() == 1) |
118 | 5 | { |
119 | 5 | return m_dequeue.at(0); |
120 | 5 | } |
121 | 16 | std::sort(backup.begin(), backup.end()); |
122 | 16 | #ifdef BT_TEST |
123 | 16 | std::cout << " " << std::endl; |
124 | 16 | for (auto i : backup) |
125 | 233 | { |
126 | 233 | std::cout << i << " "; |
127 | 233 | } |
128 | 16 | std::cout << " " << std::endl; |
129 | 16 | #endif |
130 | 16 | _mode = _modeTemp = backup.at(0); |
131 | 16 | backup.pop_front(); |
132 | 16 | for (auto b : backup) |
133 | 217 | { |
134 | 217 | if (_modeTemp == b) |
135 | 135 | { |
136 | 135 | modeCounter++; |
137 | 135 | } |
138 | 82 | else |
139 | 82 | { |
140 | 82 | _modeTemp = b; |
141 | 82 | modeCounter = 1; |
142 | 82 | } |
143 | 217 | |
144 | 217 | if(counter < modeCounter) |
145 | 80 | { |
146 | 80 | counter = modeCounter; |
147 | 80 | _mode = _modeTemp; |
148 | 80 | } |
149 | 217 | } |
150 | 16 | #ifdef BT_TEST |
151 | 16 | std::cout << " moda: " << _mode << " wystepuje razy " << counter << std::endl; |
152 | 16 | #endif |
153 | 16 | return _mode; |
154 | 16 | } Line | Count | Source | 110 | 13 | T mode(){ | 111 | 13 | | 112 | 13 | T _mode = 0; | 113 | 13 | T _modeTemp = 0; | 114 | 13 | int counter = 1; | 115 | 13 | int modeCounter = 1; | 116 | 13 | auto backup = m_dequeue; | 117 | 13 | if(m_dequeue.size() == 1) | 118 | 3 | { | 119 | 3 | return m_dequeue.at(0); | 120 | 3 | } | 121 | 10 | std::sort(backup.begin(), backup.end()); | 122 | 10 | #ifdef BT_TEST | 123 | 10 | std::cout << " " << std::endl; | 124 | 10 | for (auto i : backup) | 125 | 89 | { | 126 | 89 | std::cout << i << " "; | 127 | 89 | } | 128 | 10 | std::cout << " " << std::endl; | 129 | 10 | #endif | 130 | 10 | _mode = _modeTemp = backup.at(0); | 131 | 10 | backup.pop_front(); | 132 | 10 | for (auto b : backup) | 133 | 79 | { | 134 | 79 | if (_modeTemp == b) | 135 | 15 | { | 136 | 15 | modeCounter++; | 137 | 15 | } | 138 | 64 | else | 139 | 64 | { | 140 | 64 | _modeTemp = b; | 141 | 64 | modeCounter = 1; | 142 | 64 | } | 143 | 79 | | 144 | 79 | if(counter < modeCounter) | 145 | 8 | { | 146 | 8 | counter = modeCounter; | 147 | 8 | _mode = _modeTemp; | 148 | 8 | } | 149 | 79 | } | 150 | 10 | #ifdef BT_TEST | 151 | 10 | std::cout << " moda: " << _mode << " wystepuje razy " << counter << std::endl; | 152 | 10 | #endif | 153 | 10 | return _mode; | 154 | 10 | } |
Line | Count | Source | 110 | 8 | T mode(){ | 111 | 8 | | 112 | 8 | T _mode = 0; | 113 | 8 | T _modeTemp = 0; | 114 | 8 | int counter = 1; | 115 | 8 | int modeCounter = 1; | 116 | 8 | auto backup = m_dequeue; | 117 | 8 | if(m_dequeue.size() == 1) | 118 | 2 | { | 119 | 2 | return m_dequeue.at(0); | 120 | 2 | } | 121 | 6 | std::sort(backup.begin(), backup.end()); | 122 | 6 | #ifdef BT_TEST | 123 | 6 | std::cout << " " << std::endl; | 124 | 6 | for (auto i : backup) | 125 | 144 | { | 126 | 144 | std::cout << i << " "; | 127 | 144 | } | 128 | 6 | std::cout << " " << std::endl; | 129 | 6 | #endif | 130 | 6 | _mode = _modeTemp = backup.at(0); | 131 | 6 | backup.pop_front(); | 132 | 6 | for (auto b : backup) | 133 | 138 | { | 134 | 138 | if (_modeTemp == b) | 135 | 120 | { | 136 | 120 | modeCounter++; | 137 | 120 | } | 138 | 18 | else | 139 | 18 | { | 140 | 18 | _modeTemp = b; | 141 | 18 | modeCounter = 1; | 142 | 18 | } | 143 | 138 | | 144 | 138 | if(counter < modeCounter) | 145 | 72 | { | 146 | 72 | counter = modeCounter; | 147 | 72 | _mode = _modeTemp; | 148 | 72 | } | 149 | 138 | } | 150 | 6 | #ifdef BT_TEST | 151 | 6 | std::cout << " moda: " << _mode << " wystepuje razy " << counter << std::endl; | 152 | 6 | #endif | 153 | 6 | return _mode; | 154 | 6 | } |
|
155 | | |
156 | | float trend(){ |
157 | | int down = 0; |
158 | | int eq = 0; |
159 | | int up = 0; |
160 | | int lp = 0; |
161 | | T diff = 0; |
162 | | T first = m_dequeue[0]; |
163 | | |
164 | | for (auto i = 1 ; i < m_dequeue.size(); ++i){ |
165 | | if (first < m_dequeue[i]){ |
166 | | up++; |
167 | | if (m_dequeue[i] - first > diff){ |
168 | | diff = m_dequeue[i] - first; |
169 | | lp = i; |
170 | | } |
171 | | } |
172 | | if (first == m_dequeue[i]){ eq++;} |
173 | | if (first > m_dequeue[i]){ |
174 | | if (diff < first - m_dequeue[i] ){ |
175 | | diff = first - m_dequeue[i]; |
176 | | lp = i; |
177 | | } |
178 | | down++; |
179 | | } |
180 | | first = m_dequeue[i]; |
181 | | } |
182 | | std::cout <<"up "<<up<<" eq "<< eq << " down "<< down <<" max diff "<< diff<<" lp "<<lp << std::endl; |
183 | | return 2.2; |
184 | | } |
185 | | |
186 | 20 | bool isMoreDiff(T diff){ |
187 | 20 | if (m_dequeue.size()>2){ |
188 | 14 | T d = m_dequeue.at( m_dequeue.size()-2) |
189 | 14 | - m_dequeue.at( m_dequeue.size() - 1); |
190 | 14 | d = fabs(d); |
191 | 14 | if (d > diff && m_alarm == false){ |
192 | 6 | m_alarm = true; |
193 | 6 | return true; |
194 | 6 | } |
195 | 8 | if (d <= diff){ |
196 | 8 | m_alarm = false; |
197 | 8 | return false; |
198 | 8 | } |
199 | 6 | } |
200 | 6 | return false; |
201 | 6 | } |
202 | 7 | std::pair<double,double> getLast2(){ |
203 | 7 | if (m_dequeue.size()>2){ |
204 | 6 | return std::make_pair(static_cast<double>(m_dequeue.at( m_dequeue.size()-2)), |
205 | 6 | static_cast<double>(m_dequeue.at( m_dequeue.size()-1)) ); |
206 | 6 | } |
207 | 1 | #ifdef BT_TEST |
208 | 1 | puts("no data - return 0.0 0.0"); |
209 | 1 | #endif |
210 | 1 | return std::make_pair(0.0,0.0); |
211 | 1 | } |
212 | | |
213 | | ///////////////////////////////////////////////////////////////////////////////////// |
214 | 14 | void print(){ |
215 | 71 | for(auto n : m_dequeue){ |
216 | 71 | std::cout << ","<< n ; |
217 | 71 | } |
218 | 14 | std::cout << " " <<std::endl; |
219 | 14 | } |
220 | | |
221 | | |
222 | 4 | std::string stats(){ |
223 | 4 | |
224 | 4 | std::stringstream ss(" brak danych =("); |
225 | 4 | if(size()>0) |
226 | 3 | { |
227 | 3 | ss.str(""); |
228 | 3 | ss <<"rozmiar tablicy: "<< size() <<std::endl |
229 | 3 | << "min: "<< min() <<std::endl |
230 | 3 | << "max: "<< max()<<std::endl |
231 | 3 | << "srednia " << average() <<std::endl |
232 | 3 | << "mediana " << median() <<std::endl |
233 | 3 | << "odchylenie st "<< standardDeviation() << std::endl |
234 | 3 | << "wspolczynnik zmiennosci " << coefficientOfVariation() <<"%"<< std::endl |
235 | 3 | << "Dominanta " << mode(); |
236 | 3 | |
237 | 3 | |
238 | 3 | ss << std::endl |
239 | 3 | << "data " << std::endl; |
240 | 16 | for(auto n : m_dequeue){ |
241 | 16 | ss << "|"<< n ; |
242 | 16 | } |
243 | 3 | } |
244 | 4 | ss << std::endl; |
245 | 4 | return ss.str(); |
246 | 4 | } |
247 | | |
248 | | private: |
249 | | unsigned int m_size; |
250 | | std::deque <T> m_dequeue; |
251 | | bool m_alarm = false; |
252 | | }; |
253 | | |
254 | | #endif // STATISTIC_H |